Rust におけるマクロ
from 項目28:分別をもってマクロを使おう
Rust のマクロは他言語のマクロと異なり、プログラムのパースされた トークン 列や 抽象構文木(AST)に対して動作する
これによりコードの構造を認識することが可能なので、マクロでよく起こりがちな問題(e.g. キャプチャ)を回避できる
健全なマクロ
2 種類のマクロ
1. 宣言的マクロ
マクロへの入力に基づいて、プログラムに任意のコードを挿入する(e.g. println! マクロ)
詳細: https://doc.rust-lang.org/reference/macros-by-example.html
2. 手続き的マクロ
パースされたトークンに基づいて、プログラムに任意のコードを挿入する(e.g. derive マクロ)
これにより 動的型付け言語 のような表現力を得つつ、コンパイル時の安全性は保証される
また、リフレクション の制限による影響を緩和することもできる
定義時、利用する場所とは別の独立した(proc-macro = true をセットした)クレートとして定義する必要がある
入力トークン列を処理するために、proc_macro(標準の ツールチェーン に含まれる)や proc-macro2 を用いる
手続き的マクロは更に 3 つの種類に分かれる
1. 関数的マクロ: 引数を用いて呼び出す
2. 属性マクロ: プログラムの何らかの文法要素に付与する
3. derive マクロ: データ構造の定義に付与する
#Rust #Effective_Rust_―_Rustコードを改善し、エコシステムを最大限に活用するための35項目